import type { UserConfig, ConfigEnv } from 'vite';
import { loadEnv } from 'vite';
import vueJsx from '@vitejs/plugin-vue-jsx';
import legacy from '@vitejs/plugin-legacy';
import vue from '@vitejs/plugin-vue';
import { resolve } from 'path';
// mockJs
import { viteMockServe } from 'vite-plugin-mock';

import styleImport from 'vite-plugin-style-import';
// ArcoResolver 按需加载（模板）
import IconsResolver from 'unplugin-icons/resolver';
import Icons from 'unplugin-icons/vite';
// components
import AutoImport from 'unplugin-auto-import/vite';
import Components from 'unplugin-vue-components/vite';
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers';
import WindiCSS from 'vite-plugin-windicss';
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons';
import Inspect from 'vite-plugin-inspect';
// import viteCompression from 'vite-plugin-compression';
import glob from 'glob';
const CWD = process.cwd();

// 保存每个页面的名称和路径，后面会用到
const multiPage = {};
// 保存页面文件路径
const pageEntry = {};
function getInput() {
  const allEntry = glob.sync('./src/pages/**/index.html');
  allEntry.forEach((entry: string) => {
    const pathArr = entry.split('/');
    const name = pathArr[pathArr.length - 2];
    multiPage[name] = {
      name,
      rootPage: `./src/pages/${name}/index.html`,
    };
    pageEntry[name] = resolve(__dirname, `./src/pages/${name}/index.html`);
  });
}

getInput();
// 环境变量
// const BASE_ENV_CONFIG = loadEnv('', CWD);
// const DEV_ENV_CONFIG = loadEnv('development', CWD);
// const PROD_ENV_CONFIG = loadEnv('production', CWD);

export default ({ command, mode }: ConfigEnv): UserConfig => {
  // 环境变量
  const { VITE_BUILD_PORT, VITE_BASE_URL, VITE_APP_BASE_API, VITE_DROP_CONSOLE, VITE_BASE_API } =
    loadEnv(mode, CWD);

  const isBuild = command === 'build';
  console.log('当前执行环境：', isBuild);
  return {
    base: VITE_BASE_URL,
    resolve: {
      alias: [
        {
          find: '@',
          replacement: resolve(__dirname, 'src'),
        },
        {
          find: '~',
          replacement: resolve(__dirname, './'),
        },
      ],
    },
    // 强制预构建插件包
    optimizeDeps: {
      include: [
        '@vueuse/core',
        'element-plus',
        'wangeditor',
        `vuedraggable`,
        `lodash-es`,
        `monaco-editor/esm/vs/language/json/json.worker`,
        `monaco-editor/esm/vs/language/css/css.worker`,
        `monaco-editor/esm/vs/language/html/html.worker`,
        `monaco-editor/esm/vs/language/typescript/ts.worker`,
        `monaco-editor/esm/vs/editor/editor.worker`,
      ],
      exclude: ['vue-demi'],
    },
    plugins: [
      vue(),
      WindiCSS(),
      vueJsx({
        // options are passed on to @vue/babel-plugin-jsx
      }),
      legacy({
        targets: ['defaults', 'not IE 11'],
      }),
      createSvgIconsPlugin({
        // 指定要缓存的图标文件夹
        iconDirs: [resolve(CWD, 'src/assets/icons')],
        // 执行icon
        symbolId: 'svg-icon-[dir]-[name]',
      }),
      // mock.js
      viteMockServe({
        ignore: /^\_/, // 忽略指定格式的文件
        mockPath: 'mock', // mock文件夹
        supportTs: true, // 读取ts，打开后就无法监视js了
        localEnabled: !isBuild, // 开发打包开关
        prodEnabled: isBuild, // 生产打包开关
        logger: true, //是否在控制台显示请求日志
        injectCode: `
         import { setupProdMockServer } from '../mock/_createProdMockServer.ts';

         setupProdMockServer();
         `,
      }),
      // 按需求加载(模板)
      AutoImport({
        imports: ['vue'],
        resolvers: [
          IconsResolver({
            prefix: 'Icon',
          }),
          ElementPlusResolver(),
        ],
        dts: 'auto-imports.d.ts',
      }),
      Components({
        resolvers: [
          // 自动注册图标组件
          IconsResolver({
            enabledCollections: ['ep'],
          }),
          ElementPlusResolver(),
        ],
        dts: 'components.d.ts',
      }),
      Icons({
        autoInstall: true,
      }),
      Inspect(),
      styleImport({
        libs: [
          {
            libraryName: 'element-plus',
            esModule: true,
            resolveStyle: (name: string) => {
              console.log(name);
              // return `element-plus/lib/theme-chalk/${name}.css`;
              return `element-plus/dist/index.css`;
            },
          },
        ],
      }),
      // viteCompression({
      //   //生成压缩包gz
      //   verbose: true, // 输出压缩成功
      //   disable: false, // 是否禁用
      //   threshold: 1, // 体积大于阈值会被压缩，单位是b
      //   algorithm: 'gzip', // 压缩算法
      //   ext: '.gz', // 生成的压缩包后缀
      // }),
    ],
    css: {
      preprocessorOptions: {
        // less: {
        //   modifyVars: {},
        //   javascriptEnabled: true,
        // },
        // less: {
        //   javascriptEnabled: true,
        //   strictMath: false,
        //   noIeCompat: true,
        //   modifyVars: {
        //     '@header-height': '64px',
        //     '@footer-height': '70px',
        //   },
        // },
        scss: {
          additionalData: `
          @use 'sass:math';
          @import "@/styles/global.scss";
          @import "@/styles/lowCode.scss";
          @import "@/styles/scollbar.scss";
          `,
        },
      },
    },
    server: {
      host: true, //
      open: false, // 设置服务启动时是否自动打开浏览器
      cors: true, // 允许跨域
      port: VITE_BUILD_PORT as unknown as number, // 设置服务启动端口号
      proxy: {
        '/sys': {
          target: VITE_APP_BASE_API + VITE_BASE_API,
          // target: 'http://localhost:7001',
          changeOrigin: true,
          rewrite: (path) => path.replace(/^\/sys/, ''),
        },
      },
    },
    build: {
      cssCodeSplit: true, // 如果设置为false，整个项目中的所有 CSS 将被提取到一个 CSS 文件中
      sourcemap: false, // 构建后是否生成 source map 文件。如果为 true，将会创建一个独立的 source map 文件
      assetsInlineLimit: 4096, // 单位字节（1024等于1kb） 小于此阈值的导入或引用资源将内联为 base64 编码，以避免额外的 http 请求。设置为 0 可以完全禁用此项。
      minify: 'terser', // 'terser' 相对较慢，但大多数情况下构建后的文件体积更小。'esbuild' 最小化混淆更快但构建后的文件相对更大。
      target: 'modules',
      rollupOptions: {
        input: pageEntry,
      },
      terserOptions: {
        compress: {
          keep_infinity: true,
          drop_console: !!VITE_DROP_CONSOLE,
        },
      },
      // 设置打包限制警报
      chunkSizeWarningLimit: 1500, // chunk 大小警告的限制（以 kbs 为单位）
    },
  };
};
